import java.util.Arrays;

public class Test_2 {

//  求数组元素的平均值


    public static void main(String[] args) {
        int [] array = {1,2,3,4,5,6,7,8,9,10};
        int sum = 0;
        for (int x:array) {
            sum += x;
        }
        System.out.println(sum*1.0 / array.length);
    }





//  拷贝一个数组

    public static int [] myCopyOf(int [] array){
        int [] copy = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            copy [i] = array [i];
        }
        return copy;
    }

    public static void main7(String[] args) {
        int [] array = {1,2,3,4,5};
        int [] copy = myCopyOf(array);
//      Java自带的copyOf:
        int [] copy2 = Arrays.copyOf(array,2*array.length);
        System.out.println(Arrays.toString(copy));
        System.out.println(Arrays.toString(copy2));
        int [] copy3 = Arrays.copyOfRange(array,2,5);//Java 当中的范围一般是左闭右开：[2,5)
        System.out.println(Arrays.toString(copy3));

    }




//  toString 的模拟实现

    public static String myToString(int [] array){
        String str = "[";
        for(int i = 0;i < array.length;i++){
            str = str + array[i];
            if(i != array.length - 1){
                str = str + ", ";
            }
        }
        str = str + "]";
        return str;
    }

    public static void main6(String[] args) {
        int [] array = {1,2,3,4,5};
        String ret = myToString(array);
        System.out.println(ret);
    }





//    在 Java 中可以将数组作为返回值

    public static int [] test(){
        int [] ret = {1,2,3,4,5};
        return ret;
    }

    public static void main5(String[] args) {
        int [] tmp = test();
        System.out.println(Arrays.toString(tmp));
    }



    public static void func1(int [] array){
        array = new int [] {1,2,3};//仅仅只修改了形参的指向
    }

    public static void func2(int [] array){
        array [0] = 199;
    }

    public static void main4(String[] args) {
        int [] array = {10,20,30};
//        func1(array);
        func2(array);
        System.out.println(Arrays.toString(array));
    }


    public static void func() {
        int[] array1 = new int[3];
        array1[0] = 10;
        array1[1] = 20;
        array1[2] = 30;

        int[] array2 = new int[]{1,2,3,4,5};
        array2[0] = 100;
        array2[1] = 200;
//      array 2 :{100,200,3,4,5}

        array1 = array2;
//      代表 array1 指向 array2了，下面修改的 array1、array2 都是对 array2 进行修改
        array1[2] = 300;
        array1[3] = 400;
        array2[4] = 500;
//      array 2 :{100,200,300,400,500}

        for (int i = 0; i < array2.length; i++) {
            System.out.print(array2[i] + " ");
        }
        System.out.println();
        System.out.println("==============================");
        for (int i = 0; i < array1.length; i++) {
            System.out.print(array1[i] + " ");
        }
    }

    public static void main3(String[] args) {
        func();
    }


//    数组的使用：
    public static void main2(String[] args) {
        int [] array = new int [] {12,23,34,45,56};
        System.out.println(array[2]);
//        System.out.println(array[21]);
//      若是超出数组范围，会出现数组越界异常的错误

//        求数组长度：
        System.out.println(array.length);
//        数组的打印：
//        1 . for 循环遍历打印：
        for(int i = 0;i < array.length;i++){
            System.out.print(array[i] + " ");
        }
        System.out.println();
//      通过数组下标访问，需要知道长度

//        2 . foreach 打印：
//        由一个冒号：分隔开，左边是数组中的元素类型，右边是数组名
        for (int x:array) {
            System.out.print(x + " ");
        }
//      直接输出数组中的值，不需要知道长度
        System.out.println();
//      将数组以字符串的形式进行输出：
        String ret = Arrays.toString(array);
        System.out.print(ret);
    }





//    Java 中的数组

    public static void main1(String[] args) {
        int [] array1 = {0,1,2,3,4};
        int [] array2 = new int [] {1,2,3,4,5};
        int [] array3 = new int [10];
//      array3 中只给了 10 个int 类型的值，并未初始化，默认为 0

        int [] array4;
        array4 = new int [] {9,8,7,6,5,4};
//      可以但不建议

        int [] array5;
//        array5 = {1,3,5,7,9};这样不行

//        int array2 [] = {0,1,2,3,4,5};

        boolean [] flag = new boolean[5];
//      布尔类型默认为false

    }
}
